package Servicios;

import java.util.List;
import java.util.Vector;

import Negocio.CuentaCorriente;
import Negocio.ItemCuentaCorriente;
import Persistencia.IRepository;
import Persistencia.QueryParameter;
import Persistencia.Repository;
import Persistencia.RepositoryException;



public class ServicioItemsCuentasCorrientes {
	private IRepository<ItemCuentaCorriente> repositorioItemCuentaCorrientes;
	private static ServicioItemsCuentasCorrientes instance = null;
	
	private ServicioItemsCuentasCorrientes() {
		this.repositorioItemCuentaCorrientes = new Repository<ItemCuentaCorriente>();
	}
	
	public static ServicioItemsCuentasCorrientes getInstance() {
		if (instance == null) {
			instance = new ServicioItemsCuentasCorrientes();
		}
		return instance;
	}
	
	public List<ItemCuentaCorriente> getItemsCuentaCorrienta(int cuentaCorrienteId) throws RepositoryException {
		String queryExpression = "from ItemCuentaCorriente c where c.cuentaCorriente.cuentaCorrienteId = :cuentaCorrienteId";
		QueryParameter parameter = new QueryParameter("cuentaCorrienteId", cuentaCorrienteId);
		List<ItemCuentaCorriente> items= this.repositorioItemCuentaCorrientes.getAll(queryExpression, parameter);
		
		return items;
	}
	
	public List<ItemCuentaCorriente> getItemCuentaCorrientes() throws ServiceException {
		List<ItemCuentaCorriente> ItemCuentaCorrientes;
		
		try {
			ItemCuentaCorrientes = this.repositorioItemCuentaCorrientes.getAll(ItemCuentaCorriente.class);
		} catch (RepositoryException e) {
			throw new ServiceException(e);
		}	
		
		List<ItemCuentaCorriente> result = new Vector<ItemCuentaCorriente>();
		
		for(ItemCuentaCorriente ItemCuentaCorriente : ItemCuentaCorrientes) {
			result.add(ItemCuentaCorriente);
		}
		
		return result;
	}

	public ItemCuentaCorriente getItemCuentaCorriente(String dni) throws ServiceException {
		try {
			return this.getItemCuentaCorrienteExistente(dni);
		} catch (RepositoryException e) {
			throw new ServiceException(e);
		}
	}

	public void guardarOActualizar(ItemCuentaCorriente itemCuentaCorriente) throws ServiceException {
		try {
			this.repositorioItemCuentaCorrientes.saveOrUpdate(itemCuentaCorriente);
		} catch (RepositoryException e) {
			throw new ServiceException(e);
		}
	}

	
	private ItemCuentaCorriente getItemCuentaCorrienteExistente(String dni) throws RepositoryException {
		String queryExpression = "from ItemCuentaCorriente c where c.dni = :dni";
		QueryParameter parameter = new QueryParameter("dni", dni);
		ItemCuentaCorriente ItemCuentaCorriente = this.repositorioItemCuentaCorrientes.get(queryExpression, parameter);
		
		return ItemCuentaCorriente;
	}
	
	

	public Boolean existeItemCuentaCorriente(String dni) throws ServiceException {
		return this.getItemCuentaCorriente(dni) != null;
	}

	
	public void eliminarItemCuentaCorriente(String dni) throws ServiceException {
		
	}
	
	public static void main(String[] args) throws RepositoryException {
		List<ItemCuentaCorriente> items = ServicioItemsCuentasCorrientes.getInstance().getItemsCuentaCorrienta(1);
		for (ItemCuentaCorriente itemCuentaCorriente : items) {
			System.out.println(itemCuentaCorriente.getDescripcion());
		}
	}

	
}
